﻿<?php

App::uses('PrivadoController', 'Controller');
App::uses('Folder', 'Utility');
App::uses('File', 'Utility');

class AdminController extends PrivadoController
{
    private $meses = array(
        1 => 'Enero',
        2 => 'Febrero',
        3 => 'Marzo',
        4 => 'Abril',
        5 => 'Mayo',
        6 => 'Junio',
        7 => 'Julio',
        8 => 'Agosto',
        9 => 'Septiembre',
        10 => 'Octubre',
        11 => 'Noviembre',
        12 => 'Diciembre',
    );

    public function __construct($request = null, $response = null)
    {
        parent::__construct($request, $response);
        $this->layout = 'privado';
    }

    public function parseBanorte()
    {
        $dt = new DateTime();
        $this->set('year', $dt->format('Y'));
        $this->set('title', 'Administrador');
        $this->set('description', 'Cargar recuperaciones');
    }

    public function restricciones()
    {
        $params = $this->request->data;
        if (count($params) == 0)
        {
            $this->redirect('parseBanorte');
        }
        else
        {
            $filesOK = array_filter($_FILES, function($file) {
                        if ($file['error'] == UPLOAD_ERR_OK)
                        {
                            return $file;
                        }
                    });
            if (count($filesOK) == 0)
            {
                $this->redirect('parseBanorte');
            }
            else
            {
                $this->loadModel('Archivo');
                $mes = $params['mes'];
                $anio = $params['anio'];
                $nameFile = $this->moveUploaded($filesOK, $mes, $anio);
                $files = $this->Archivo->getByMonthAndYear($mes, $anio);
                $files = array_map(function($file) {
                            return basename($file['archivos']['ubicacion']);
                        }, $files);
                $this->set('nameFile', $nameFile);
                $this->set('mes', $this->meses[$mes]);
                $this->set('anio', $anio);
                $this->set('files', $files);
                $this->set('title', 'Administrador');
                $this->set('description', 'Cargar recuperaciones');
            }
        }
    }

    public function procesaBanorte()
    {
        set_time_limit(36000);
        $recuperaciones = $_SESSION['recuperaciones'];
        if ($recuperaciones !== null)
        {
            $this->loadModel('Archivo');
            $archivo = array();
            $archivo['ubicacion'] = $recuperaciones->files[0];
            $archivo['mes'] = $recuperaciones->mes;
            $archivo['anio'] = $recuperaciones->anio;
            $this->Archivo->save($archivo);
            $this->Archivo->clear();
            $idFile = $this->Archivo->getInsertId();

            $file = @fopen($archivo['ubicacion'], "r");
            if ($file)
            {
                $this->loadModel('Recuperacion');
                $i = 0;
                while (($line = fgets($file)) !== false)
                {
                    if ($i++ == 0)
                        continue;
                    $array = array();
                    $strDate = substr($line, 1, 8);
                    $date = new DateTime($strDate);
                    $array['fecha'] = $date->format('Y-m-d');
                    $array['anio'] = $archivo['anio'];
                    $array['mes'] = $archivo['mes'];
                    $array['rfc'] = substr($line, 19, 10);
                    $array['concepto'] = trim(substr($line, 59, 40));
                    $array['monto_cadena'] = (int) trim(substr($line, 100, 16));
                    $array['monto'] = (float) $array['monto_cadena'] / 100;
                    $array['cuenta_bancaria'] = trim(substr($line, 141, 10));
                    $array['codigo'] = (int) trim(substr($line, 165, 2));
                    $array['id_archivo'] = $idFile;
                    $this->Recuperacion->save($array);
                    $this->Recuperacion->clear();
                }
                fclose($file);
                $this->set('totalImportados', $i);
                $this->set('mes', $this->meses[$archivo['mes']]);
                $this->set('anio', $archivo['anio']);
                $this->set('archivo', basename($archivo['ubicacion']));
                $this->set('title', 'Administrador');
                $this->set('description', 'Resultados de importación');
            }
        }
    }

    private function moveUploaded($files, $mes, $anio)
    {
        $recuperaciones = new stdClass();
        $recuperaciones->mes = $mes;
        $recuperaciones->anio = $anio;
        $recuperaciones->files = array();
        foreach ($files as $file => $data)
        {
            $tmp_name = $data["tmp_name"];
            $name = WWW_ROOT . "files/RecuperacionesCargadas/" . $data["name"];
            move_uploaded_file($tmp_name, $name);
            $recuperaciones->files[] = $name;
        }
        $_SESSION['recuperaciones'] = $recuperaciones;
        return count($recuperaciones->files) > 0 ? basename($recuperaciones->files[0]) : '';
    }

    public function cargoManual()
    {
        $this->set('title', 'Administrador');
        $this->set('description', 'Recuperaciónes manuales');
    }

    public function seleccionarCredito()
    {
        $params = $this->request->data;
        $this->loadModel('Credito');
        $rfc = $params['rfc'];
        $rfcHomoclave = $rfc;
        if (strlen($rfc) == 10)
        {
            /// Le quitamos la homoclave
            $rfcHomoclave = $rfc . '000';
        }
        $prestamos = $this->Credito->getCreditosVigentesByRfc($rfcHomoclave);
        $this->set('rfc', $rfc);
        $this->set('prestamos', $prestamos);
        $this->set('title', 'Administrador');
        $this->set('description', 'Recuperaciónes manuales');
    }

    public function preRegistrarPago($id)
    {
        $this->loadModel('Credito');
        $credito = $this->Credito->findById($id);
        $this->set('credito', $credito['Credito']);
        $this->set('title', 'Administrador');
        $this->set('description', 'Recuperaciónes manuales');
    }

    public function registrarPago()
    {
        $params = $this->request->data;
        $this->loadModel('Credito');
        $this->loadModel('Recuperacion');
        $credito = $this->Credito->findById($params['id']);
        $liquidacion = 0;
        if (isset($params['liquidar']) === true)
        {
            $liquidacion = 1;
        }
        $this->Recuperacion->insertManualEntry($credito['Credito'], $params['anio'], $params['mes'], $params['monto'], $params['cuenta'], $liquidacion);
        if (isset($params['liquidar']) === true)
        {
            $this->Credito->liquidar($params['id']);
        }
        $this->set('title', 'Administrador');
        $this->set('description', 'Recuperaciónes manuales');
    }

    public function creditoNuevo()
    {
        $success = null; // ni fu ni fa
        $data = null;
        if ($this->request->is('post') === true)
        {
            $success = $this->crearCreditoNuevo();
            # Si es cadena significa que hubo un error, en este caso pasamos
            # los datos de post de nuevo a la vista para que solo se modifiquen
            # los datos que no fueron validos.
            if (is_string($success) === true)
            {
                $data = $this->request->data;
            }
        }
        $this->set('data', $data);
        $this->set('success', $success);
        $this->set('title', 'Administrador');
        $this->set('description', 'Crédito nuevo');
    }

    private function crearCreditoNuevo()
    {
        $params = $this->request->data;
        $this->loadModel('Credito');
        $this->loadModel('User');
        $success = $this->validarCreditoNuevo($params);
        if ($success === true)
        {
            $this->Credito->insert($params);
            $user = $params['rfc'];
            $pass = substr($params['rfc'], 4, 6);
            $this->User->insert($user, $pass);
        }
        return $success;
    }

    public function creditosNuevos()
    {
        $this->set('title', 'Administrador');
        $this->set('description', 'Créditos nuevos (importacion masiva)');
    }

    public function restriccionesMultiplesCreditos()
    {
        $success = false;
        $msgError = 'No se definio un archivo con los créditos nuevos u ocurrio un error al tratar de procesar su contenido.';
        $creditosOK = array();
        if ($this->request->is('post') === true)
        {
            $nameFile = $this->parseCreditosNuevos();
            $file = fopen($nameFile, "r");
            if (is_string($nameFile) === true)
            {
                $i = 0;
                while (($fields = fgetcsv($file)) !== false)
                {
                    if ($i++ == 0)
                        continue;
                    if (count($fields) != 15)
                    {
                        goto error;
                    }
                    $params = array();
                    $params['rfc'] = $fields[0];
                    $params['folio'] = $fields[1];
                    $params['delegacion'] = $fields[2];
                    $params['nombre'] = $fields[3];
                    $params['paterno'] = $fields[4];
                    $params['materno'] = $fields[5];
                    $params['cuenta'] = $fields[6];
                    $params['monto'] = $fields[7];
                    $params['plazo'] = $fields[8];
                    $params['pagoMensual'] = $fields[9];
                    $params['totalPago'] = $fields[10];
                    $params['ahorro'] = $fields[11];
                    $params['interes'] = $fields[12];
                    $params['instrumento'] = $fields[13];
                    $params['fechaInstrumento'] = $fields[14];
                    $msg = $this->validarCreditoNuevo($params);
                    if (is_string($msg) === true)
                    {
                        $msgError = $msg;
                        goto error;
                    }
                    $creditosOK[] = $params;
                }
                $success = true;
            }
        }
        error:
        if ($success === true)
        {
            $this->loadModel('Credito');
            $this->loadModel('User');
            foreach ($creditosOK as $credito)
            {
                $this->Credito->insert($credito);
                $user = $credito['rfc'];
                $pass = substr($credito['rfc'], 4, 6);
                $this->User->insert($user, $pass);
		$this->Credito->clear();
		$this->User->clear();
            }
        }
        $this->set('creditosOK', $creditosOK);
        $this->set('success', $success);
        $this->set('msgError', $msgError);
        $this->set('title', 'Administrador');
        $this->set('description', 'Créditos nuevos (importacion masiva)');
    }

    public function download()
    {
        $options = array(
            'download' => true,
            'name' => 'FormatoCreditosNuevos.csv',
        );
        $this->response->file('files' . DS . 'FormatoCreditosNuevos.csv', $options);
        return $this->response;
    }

    private function parseCreditosNuevos()
    {
        $files = $_FILES;
        $dt = new DateTime();
        $nameFolder = $dt->format('Ymd_His');
        $dir = new Folder();
        $path = 'files' . DS . 'creditosNuevos' . DS . $nameFolder . DS;
        $dir->create($path);
        $name = null;
        foreach ($files as $file => $data)
        {
            $tmp_name = $data["tmp_name"];
            $name = WWW_ROOT . $path . $data["name"];
            move_uploaded_file($tmp_name, $name);
        }
        return $name;
    }

    private function validarCreditoNuevo(&$params)
    {
        $params = array_map(function($param) {
                    return trim($param);
                }, $params);
        if (isset($params['rfc']) === true)
        {
            $param = $params['rfc'];
            if (preg_match('/^[a-zA-Z]{4}[0-9]{6}$/', $param) === 1)
            {
                $params['rfc'] = strtoupper($param . '000'); #Le agregamos la homoclave
            }
            else
            {
		return 'El R.F.C.'.$params['rfc'].' no tiene el formato requerido (XXXX999999).';
            }
        }
        if (isset($params['folio']) === true)
        {
            $param = $params['folio'];
            if (empty($param) === true)
            {
                return 'Folio es requerido.';
            }
        }
        if (isset($params['delegacion']) === true)
        {
            $param = $params['delegacion'];
            if (empty($param) === true)
            {
                return 'Delegación es requerida.';
            }
        }
        if (isset($params['nombre']) === true)
        {
            $param = $params['nombre'];
            if (empty($param) === true)
            {
                return 'Nombre es requerido.';
            }
        }
        if (isset($params['paterno']) === true)
        {
            $param = $params['paterno'];
            if (empty($param) === true)
            {
                return 'Apellido paterno es requerido.';
            }
        }
        if (isset($params['materno']) === true)
        {
            $param = $params['materno'];
            if (empty($param) === true)
            {
                return 'Apellido materno es requerido.';
            }
        }
        if (isset($params['cuenta']) === true)
        {
            $param = $params['cuenta'];
            if (empty($param) === true)
            {
                return 'Cuenta bancaria es requerida.';
            }
        }
        if (isset($params['monto']) === true)
        {
            $param = $params['monto'];
            if (empty($param) === true)
            {
                return 'Monto del crédito es requerido.';
            }
        }
        if (isset($params['plazo']) === true)
        {
            $param = $params['plazo'];
            if (is_numeric($param) === false)
            {
                return 'Plazo es requerido y debe ser un número.';
            }
        }
        if (isset($params['pagoMensual']) === true)
        {
            $param = $params['pagoMensual'];
            if (is_numeric($param) === false)
            {
                return 'Pago mensual es requerido y debe ser un número.';
            }
        }
        if (isset($params['totalPago']) === true)
        {
            $param = $params['totalPago'];
            if (is_numeric($param) === false)
            {
                return 'Monto total de pago es requerido y debe ser un número.';
            }
        }
        if (isset($params['ahorro']) === true)
        {
            $param = $params['ahorro'];
            if (is_numeric($param) === false)
            {
                return 'Ahorro es requerido y debe ser un número.';
            }
        }
        if (isset($params['interes']) === true)
        {
            $param = $params['interes'];
            if (is_numeric($param) === false)
            {
                return 'Interés mensual es requerido y debe ser un número.';
            }
        }
        if (isset($params['instrumento']) === true)
        {
            $param = $params['instrumento'];
            if (empty($param) === true)
            {
                return 'Instrumento es requerido.';
            }
        }
        if (isset($params['fechaInstrumento']) === true)
        {
            $param = $params['fechaInstrumento'];
            if (preg_match('/^[0-9]{4}[-][0-9]{2}[-][0-9]{2}$/', $param) === 1)
            {
                try
                {
                    list($year, $month, $day) = explode('-', $param);
                    if (checkdate($month, $day, $year) === true)
                    {
                        $dt = new DateTime($param);
                    }
                    else
                    {
                        return 'Fecha invalida.';
                    }
                }
                catch (Exception $exc)
                {
                    return 'Fecha instrumento es requerido y debe ser una fecha válida.';
                }
            }
            else
            {
                return 'Formato de fecha invalido. Especifica una fecha en formato yyyy-mm-dd.';
            }
        }
        return true; #Todo bien, parámetros OK :)
    }

}
